Technote 1120
Opening Resource Files Twice Considered Hard?
ñ⁄éü
ñ‚ëËÇÃèäç›
FSpOpenResFile ÇÃìÆçÏÇ…ä÷Ç∑ÇÈè⁄ç◊Ç»ê‡ñæ
âåàï˚ñ@ÇÃÉåÉVÉs
óvñÒ
|
ëÂïîï™Çà Mac OS ÉvÉçÉOÉâÉ}ÇÕ FSpOpenResFile (džÇÈÇ¢ÇÕDZÇÃÉãÅ[É`ÉìÇÃå√Ç¢ÉoÅ[ÉWÉáÉìÇ≈džÇÈ OpenResFile ÅAOpenRFPerm ÅAÇ®ÇÊÇ— HOpenResFile ) ÇåƒÇ—èoÇ∑DZÇΔÇ™ìÔǵǢÇΔÇÕçlǶǃǢNjÇπÇÒÅBǵǩǵÅAÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ™ä˘Ç…ÉIÅ[ÉvÉìǵǃǢÇÈÇΔÇ´Ç…ÅADZÇÍÇÁÇÃåƒÇ—èoǵǙǫÇÃÇÊǧDžìÆçÏÇ∑ÇÈÇ©ÇÕç°Ç‹Ç≈ìKêÿÇ…ÉhÉLÉÖÉÅÉìÉgÇ…ãLèqÇ≥ÇÍǃǢNjÇπÇÒÇ≈ǵÇΩÅB
DZÇà TECHNOTE Ç≈ÇÕÅAÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ™ä˘Ç…ÉIÅ[ÉvÉìǵǃǢÇÈÇΔÇ´Çà FSpOpenResFile ÇÃìÆçÏÇê≥ämÇ…ê‡ñæÇµÅADZÇÃÇΔÇ´Ç…î≠ê∂Ç∑ÇÈñ‚ëËÇâÒîÇ∑ÇÈÇΩÇflÇ…âåàï˚ñ@ÇíÒàƒÇµÇ‹Ç∑ÅB
Resource Manager ÇégópÇ∑ÇÈÇ∑Ç◊ǃÇà Mac OS ÉvÉçÉOÉâÉ}ÇÕÅADZÇà TECHNOTE ÇÃÅuóvñÒÅvÇì«ÇÒÇ≈ÅADZÇÃÇÊǧǻñ‚ëËǙdžÇÈDZÇΔÇê≥ǵÇ≠îFéØÇµÇƒÇ≠ÇæÇ≥Ç¢ÅBÇ‹ÇΩÅAîÒÉAÉvÉäÉPÅ[ÉVÉáÉìÉRÅ[ÉhÇèëǢǃǢÇÈÉvÉçÉOÉâÉ}ÇÕÅADZÇà TECHNOTE ëSëÃÇÇÊÇ≠ì«ÇÒÇ≈ÅAÇ≈Ç´ÇÈÇæÇØå›ä∑ê´Çämï€Ç∑ÇÈÇÊǧDžÉRÅ[ÉhÇãLèqǵǃÇ≠ÇæÇ≥Ç¢ÅB
|
ñ‚ëËÇÃèäç›
ÅwInside Macintosh: More Macintosh ToolboxÅx(p1-60) Ç…ÇÕÅAÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ™ä˘Ç…ÉIÅ[ÉvÉìǵǃǢÇÈÇΔÇ´Çà FSpOpenResFile ÇÃìÆçÏDžǬǢǃéüÇÃÇÊǧǻê‡ñæÇ™Ç†ÇËÇ‹Ç∑ÅB
FSpOpenResFile Çégǡǃä˘Ç…ÉIÅ[ÉvÉìǵǃǢÇÈÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇÉIÅ[ÉvÉìǵÇÊǧÇΔÇ∑ÇÈÇΔÅAä˘ë∂ÇÃÉAÉNÉZÉXÉpÉXÇ…ëŒÇ∑ÇÈÉpÅ[É~ÉbÉVÉáÉìDžǵÇΩǙǡǃÅAFSpOpenResFile Ç©ÇÁä˘ë∂ÇÃÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇ‹ÇΩÇÕêVǵǢÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇÃÇ¢Ç∏ÇÍǩǙï‘Ç≥ÇÍÇ‹Ç∑ÅBÇΩÇΔǶnjÅAǪÇÍà»ëOÇ…èëÇ´çûÇ›ÉAÉNÉZÉXÇégǡǃÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈÉtÉ@ÉCÉãÇ…ì«Ç›çûÇ›êÍópÉAÉNÉZÉXÇÃÉäÉNÉGÉXÉgÇ™ê≥èÌÇ…é¿çsÇ≥ÇÍÇÈÇΔÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÕêVǵǢÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇ™ï‘Ç≥ÇÍÇ‹Ç∑ÅBàÍï˚ÅAìØÇ∂ÉtÉ@ÉCÉãÇëŒè€Ç…èëÇ´çûÇ›ÉAÉNÉZÉXÇÃÉäÉNÉGÉXÉgÇçƒìxé¿çsÇ∑ÇÈÇΔÅAëOÇΔìØÇ∂ÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇ™ï‘Ç≥ÇÍÇ‹Ç∑ÅBDZÇÃèÍçáÅAFSpOpenResFile ÇÕǪÇÃÉtÉ@ÉCÉãÇåªç›ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãDžǵNjÇπÇÒÅB
DZÇÃê‡ñæÇÕÇŸÇΔÇÒÇ«ê≥ǵǢÇÃÇ≈Ç∑Ç™ÅAäÆëSÇ…ê≥ǵǢÇΔÇÕǢǶNjÇπÇÒÅBê≥ämÇ»èÛãµÇÕLJǡÇΔï°éGÇ≈Ç∑ÅB
- ÉtÉ@ÉCÉãÇÉIÅ[ÉvÉìÇ∑ÇÈÇΩÇflÇ…égópÇ∑ÇÈê≥ämÇ»åƒÇ—èoǵ (ǬNjÇËÅA
OpenResFile ÅAOpenRFPerm ÅAHOpenResFile ÅAÇ®ÇÊÇ— FSpOpenResFile )ÅB
- åƒÇ—èoǵDžó^ǶÇÁÇÍǃǢÇÈÉpÅ[É~ÉbÉVÉáÉìÅB
- ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ™ä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈǩǫǧǩÅB
- ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ™ä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈǩǫǧǩ (åªç›ÇÃÉvÉçÉZÉXÇ‹ÇΩÇÕï ÇÃÉvÉçÉZÉXÇ…ÇÊǡǃ)ÅB
- ï ÇÃÉvÉçÉZÉXÇ…ÇÊǡǃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ™ä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈǩǫǧǩ (DZÇÃÉvÉçÉZÉXÇÕÉçÅ[ÉJÉãÉ}ÉVÉìè„Ç‹ÇΩÇÕï ÇÃÉ}ÉVÉìè„DždžÇËÅAÉtÉ@ÉCÉãã§óLÇ…ÇÊÇËÉtÉ@ÉCÉãÇ…ÉAÉNÉZÉXǵǃǢNjÇ∑)ÅB
- ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ™ä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈǩǫǧǩ (ǪÇÍà»ëOÇ…ÉtÉ@ÉCÉãÇÉIÅ[ÉvÉìǵÇΩÇΔÇ´Ç…égópǵÇΩÉpÅ[É~ÉbÉVÉáÉìÇ≈)ÅB
DZÇÍÇÁÇÃï°éGÇ»óvàˆÇ™Ç©ÇÁÇ›çáǧDZÇΔÇ≈ÅAÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇÃÉIÅ[ÉvÉìÇÕçlǶǃǢÇΩÇÊÇËLJêˆç›ìIDžLJǡÇΔï°éGǻLJÇÃÇ…Ç»ÇËÇ‹Ç∑ÅB
ñ‚ëËÇÃä»ó™âª
çKǢǻDZÇΔÇ…ÅAëOèqǵÇΩÇ∑Ç◊ǃÇÃóvàˆÇ™ñ‚ëËÇåªé¿Ç…ï°éGâªÇ∑ÇÈÇÌÇØÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBéüÇÃê‡ñæÇ…ǵÇΩǙǡǃï™êÕÇä»ó™âªÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
-
OpenResFile ÅAOpenRFPerm ÅAHOpenResFile ÅAÇ®ÇÊÇ— FSpOpenResFile ÇÕÇ∑Ç◊ǃìØÇ∂ÇÊǧDžìÆçÏǵNjÇ∑ÅBDZÇÃDZÇΔÇÕàÍå©ñæÇÁǩǻÇÊǧDžévǶNjÇ∑Ç™ÅADTS ÉGÉìÉWÉjÉAÇΩÇøÇÕDZÇÃDZÇΔÇ™ìñëRÇæÇΔÇÕçlǶǃǢNjÇπÇÒÅBÇΩÇæÇµÅAé¿ç€Ç…ÉeÉXÉgǵÇΩåãâ ǪǧÇ≈džÇÈDZÇΔÇímÇÍÇŒà¿êSÇ≈Ç´ÇÈÇΔévǢNjÇ∑ÅB
íçà”:
OpenResFile ÇÕÉpÅ[É~ÉbÉVÉáÉìÇÃÉpÉâÉÅÅ[É^ÇÇΔÇËÇ‹ÇπÇÒÅBOpenResFile ÇåƒÇ—èoÇ∑ÇΔÅAfsCurPerm ÉpÅ[É~ÉbÉVÉáÉìÇéwíËǵÇΩÇ©ÇÃÇÊǧDžìÆçÏǵNjÇ∑ÅB
|
FSpOpenResFile ÇåƒÇ—èoÇ∑ÇΔÅAéüÇÃÇÊǧǻ 3 ǬDžǻÇËÇ‹Ç∑ÅB
- ê≥èÌèIóπ -- êVǵǢÉäÉ\Å[ÉXÉ}ÉbÉvÇ™çÏê¨Ç≥ÇÍÅAÉäÉ\Å[ÉXÉ`ÉFÅ[ÉìÇÃÇ¢ÇøÇŒÇÒè„Ç…í«â¡Ç≥ÇÍÇ‹Ç∑ÅBDZÇÃÉãÅ[É`ÉìÇÕêVǵǢÉäÉ\Å[ÉXÉ}ÉbÉvÇåªç›ÇÃÉäÉ\Å[ÉXÉ}ÉbÉvDžǵǃÅAǪÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇï‘ǵNjÇ∑ÅB
- ïîï™ìIÇ…ê≥èÌèIóπ -- ä˘ë∂ÇÃÉäÉ\Å[ÉXÉ}ÉbÉvÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇ™ï‘Ç≥ÇÍÇ‹Ç∑ÅBǪÇÃä˘ë∂ÇÃÉ}ÉbÉvÇ™åªç›ÇÃÉäÉ\Å[ÉXÉ}ÉbÉvÇ…Ç»ÇËÇ‹Ç∑ÅB
- ÉGÉâÅ[ --
FSpOpenResFile ÇÕ -1 Çï‘ǵÅAÉäÉ\Å[ÉXÉ`ÉFÅ[ÉìÇ…ïœçXÇÕâ¡Ç¶ÇÁÇÍÇ‹ÇπÇÒÅBResError ÇåƒÇ—èoǵǃÅAé¿ç€ÇÃÉGÉâÅ[î‘çÜÇéÊìæÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
íçà”:
ëOèqÇÃÅuïîï™ìIÇ»ê≥èÌèIóπÅvÇÃåãâ ÅACurResFile Ç™ïœçXÇ≥ÇÍÇ‹Ç∑ÅBDZÇÍÇÕÅAÅwInside Macintosh: More Macintosh ToolboxÅxÇ©ÇÁÇÃà¯ópÇÃç≈å„ÇÃï∂ÇΔñµèÇǵNjÇ∑ÅBDZÇà TECHNOTE Ç™ê≥ǵÇ≠ÅAÅwInside MacintoshÅxÇÃê‡ñæÇÕåÎÇËÇ≈Ç∑ÅB
|
- Ç∑Ç◊ǃÇÃèÍçáÇ≈ÅA
fsWrPerm ÇΔ fsRdWrPerm ÇÃÇ«ÇøÇÁÇéwíËǵǃLJåãâ ÇÕìØÇ∂Ç…Ç»ÇËÇ‹Ç∑ÅB
DZÇÍÇÁÇÃì_ÇëgÇ›çáÇÌÇπÇÈÇΔÅAê≥ämÇ»èÛãµÇÃê‡ñæÇ™Ç©Ç»ÇËóeà’Ç…Ç»ÇËÇ‹Ç∑ÅBécÇ≥ÇÍǃǢÇÈÇÃÇÕÅADZÇÍà»äOÇÃèÍçáÇ≈ÇÃìÆçÏÇê‡ñæÇ∑ÇÈDZÇΔÇ≈Ç∑ÅB
FSpOpenResFile ÇÃìÆçÏÇ…ä÷Ç∑ÇÈè⁄ç◊Ç»ê‡ñæ
éüÇÃàÍóóï\ÇÕÅAÇ≥NjǥNjǻèÍçáÇ… FSpOpenResFile ǙǫÇÃÇÊǧDžìÆçÏÇ∑ÇÈÇ©Çê≥ämÇ…é¶ÇµÇƒÇ¢Ç‹Ç∑ÅB
êÊì™ÇÃóÒÇÕÅAÉtÉ@ÉCÉãÇç≈èâÇ…ÉIÅ[ÉvÉìǵÇΩÇΔÇ´Ç…égópǵÇΩÉpÅ[É~ÉbÉVÉáÉìÇÃílÇé¶ÇµÇƒÇ¢Ç‹Ç∑ÅB2 î‘ñ⁄ÇÃóÒÇÕç°âÒ FSpOpenResFile ÇåƒÇ—èoÇ∑ÇΩÇflÇ…égópÇ∑ÇÈÉpÅ[É~ÉbÉVÉáÉìÇÃílÇé¶ÇµÇƒÇ¢Ç‹Ç∑ÅB
écÇËÇà 3 ǬÇÃóÒÇÕÅAéüÇà 3 ǬÇÃèÍçáǪÇÍǺÇÍÇ≈é¿çsåãâ ǙǫÇÃÇÊǧDžǻÇÈÇ©Çê‡ñæÇµÇƒÇ¢Ç‹Ç∑ÅB
- ìØÇ∂ÉvÉçÉZÉX -- ÉtÉ@ÉCÉãÇÕìØÇ∂ÉvÉçÉZÉXÇ…ÇÊǡǃä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢNjÇ∑ÅB
- ìØÇ∂É}ÉVÉì -- ÉtÉ@ÉCÉãÇÕìØÇ∂É}ÉVÉìè„ÇÃï ÇÃÉvÉçÉZÉXÇ…ÇÊǡǃä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢNjÇ∑ÅB
- àŸÇ»ÇÈÉ}ÉVÉì -- ÉtÉ@ÉCÉãÇÕÅAÉtÉ@ÉCÉãã§óLÇ…ÇÊǡǃê⁄ë±Ç≥ÇÍǃǢÇÈï ÇÃÉ}ÉVÉìè„ÇÃï ÇÃÉvÉçÉZÉXÇ…ÇÊǡǃä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢNjÇ∑ÅB
ǪÇÍǺÇÍÇÃÉZÉãÇ…ÇÕ 2 ǬÇÃçÄñ⁄Ç™é¶Ç≥ÇÍǃǢNjÇ∑ÅBëÊ 1 ÇÃçÄñ⁄ÇÕëOèqǵÇΩåƒÇ—èoǵÇÃåãâ Ç≈Ç∑ÅBëÊ 2 ÇÃçÄñ⁄ÇÕï‘Ç≥ÇÍÇΩÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇ…ä÷òAÇ∑ÇÈÉpÅ[É~ÉbÉVÉáÉì (é¿çsåãâ Ç™Åuê≥èÌèIóπÅvÇ‹ÇΩÇÕÅuïîï™ìIÇ…ê≥èÌèIóπÅvÇÃèÍçá) Ç‹ÇΩÇÕï‘Ç≥ÇÍÇΩÉGÉâÅ[ÉRÅ[Éh (é¿çsåãâ Ç™ÅuÉGÉâÅ[ÅvÇÃèÍçá) Ç≈Ç∑ÅB
DZÇÍÇ≈ÇÕǡǴÇËÇÌÇ©ÇÈDZÇΔ
ëOèqÇÃàÍóóï\Ç©ÇÁèdóvÇ»ñ‚ëËǙǢÇ≠ǬǩñæÇÁǩDžǻÇËÇ‹Ç∑ÅB
- ÉtÉ@ÉCÉãÇ™ìØÇ∂ÉvÉçÉZÉXÇ…ÇÊǡǃä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈèÍçáÅAǪÇÃÉtÉ@ÉCÉãÇ…ëŒÇµÇƒèëÇ´çûÇ›ÉpÅ[É~ÉbÉVÉáÉìÇóvãÅÇ∑ÇÈÇΔÅAé¿çsåãâ ÇÕÅuïîï™ìIÇ…ê≥èÌèIóπÅvÇΔï]âøÇ≥ÇÍÇ‹Ç∑ÅBǬNjÇËÅA
FSpOpenResFile ÇÕä˘ë∂ÇÃÉäÉ\Å[ÉXÉ}ÉbÉvÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇï‘Ç∑DZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅBDZÇÃèÛãµÇ…ëŒÇ∑ÇÈèÄîıÇdžÇÁÇ©Ç∂ÇflçsǡǃǢǻǢÇΔ (ǵǩLJÅAégópå„Ç…ÉäÉ\Å[ÉXÉ}ÉbÉvÇÉNÉçÅ[ÉYǵǃǢÇÈÇΔ) ñ ì|Ç»èÛãµÇ…Ç»ÇËÇ‹Ç∑ÅBÇΩÇΔǶnjÅAÉfÉxÉçÉbÉpÇ™äJî≠íÜÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉäÉ\Å[ÉXÉ}ÉbÉvÅAdžÇÈÇ¢ÇÕÉVÉXÉeÉÄÉäÉ\Å[ÉXÉ}ÉbÉvÇåÎǡǃÉNÉçÅ[ÉYǵǃǵNjǧÇΔǢǧÇÃÇÕÇÊÇ≠džÇÈDZÇΔÇ≈Ç∑ÅB
- óvãÅǵÇΩí ÇËÇÃÉpÅ[É~ÉbÉVÉáÉìÇéÊìæÇ≈ǴǻǢDZÇΔLJdžÇËÇ‹Ç∑ÅBÇΩÇΔǶnjÅAàÍóóï\ÇÃÅuìØÇ∂ÉvÉçÉZÉXÅvÇÃóÒÇ≈ÅAÉtÉ@ÉCÉãÇ™
fsRdPerm Çégǡǃä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈèÍçáÇ…ÅAfsRdWrPerm ÇégǡǃÉtÉ@ÉCÉãÇçƒìxÉIÅ[ÉvÉìǵÇÊǧÇΔÇ∑ÇÈÇΔÅAï‘Ç≥ÇÍÇÈÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇÕì«Ç›çûÇ›êÍópÇÃÉpÅ[É~ÉbÉVÉáÉìÇéùÇøÇ‹Ç∑ÅBå„èqÇ∑ÇÈÉTÉìÉvÉãÉRÅ[ÉhÇégópÇ∑ÇÈÇΔÅADZÇÃèÛãµÇÉ`ÉFÉbÉNÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
- ä˘Ç…ÉIÅ[ÉvÉìǵǃǢÇÈÉtÉ@ÉCÉãÇ…ëŒÇµÇƒÅAï ÇÃÉ}ÉVÉìÇ™
fsRdPerm Çégǡǃ fsRdWrPerm ÉpÅ[É~ÉbÉVÉáÉìÇóvãÅÇ∑ÇÈÇΔÅAÉãÅ[É`ÉìÇÕê≥èÌÇ…é¿çsÇ≥ÇÍÇ‹Ç∑Ç™ÅAì«Ç›çûÇ›êÍópÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇ™ï‘Ç≥ÇÍÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
- ï ÇÃÉvÉçÉZÉXÇ…ÇÊǡǃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ™ä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈÇΔÇ´Ç…ï‘Ç≥ÇÍÇÈê≥ämÇ»ÉGÉâÅ[ÉRÅ[ÉhÇÕÅAǪÇÃÉvÉçÉZÉXÇ™ÉçÅ[ÉJÉãÉ}ÉVÉìÇ≈é¿çsÇ≥ÇÍǃǢÇÈǩǫǧǩDžÇÊǡǃàŸÇ»ÇËÇ‹Ç∑ÅB
ç≈å„Ç…ÇÌÇ©ÇÈDZÇΔ
ìØÇ∂ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ 2 ìxÉIÅ[ÉvÉìÇ∑ÇÈÇΔÇ´Ç…î≠ê∂Ç∑ÇÈç≈å„ÇÃñ‚ëËÇÕ Resource Manager ÇÃê›åvǪÇÃLJÇÃÇ…ì‡ç›ÇµÇƒÇ®ÇËÅAǪÇÍÇâÒîÇ∑ÇÈDZÇΔÇÕîÒèÌÇ…ç¢ìÔÇ≈Ç∑ÅBÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇÉIÅ[ÉvÉìÇ∑ÇÈÇΔÇ´ÅAResource Manager ÇÕÇ∑Ç◊ǃÇÃÉäÉ\Å[ÉXÇÃÉJÉ^ÉçÉO (ÉäÉ\Å[ÉXÉ}ÉbÉv) ÇÉqÅ[ÉvÇ…ÉçÅ[ÉhǵÅAǪÇÃÉ}ÉbÉvÇégǡǃÅAÉäÉ\Å[ÉXÉtÉ@ÉCÉãì‡Ç…èÌíìÇ∑ÇÈǪÇÍǺÇÍÇÃÉäÉ\Å[ÉXÇÃÉfÅ[É^ÇåüçıǵNjÇ∑ÅB
ÉäÉ\Å[ÉXÉ}ÉbÉvÇïœçXǵǃLJÅAResource Manager ÇÕÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇÉIÅ[ÉvÉìǵÇΩï°êîÇÃÉvÉçÉZÉXä‘ÇÃí≤êÆÇçsǢNjÇπÇÒÅBResource Manager ÇÕÅAìØÇ∂ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ…ëŒÇµÇƒ 2 ǬÇÃì«Ç›èëÇ´â¬î\Ç»ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇÉIÅ[ÉvÉìÇ≈ǴǻǢÇÊǧDžǵNjÇ∑Ç™ÅAì«Ç›çûÇ›êÍópÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇΔì«Ç›èëÇ´â¬î\Ç»ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇìØéûÇ…éÊìæÇ∑ÇÈëÄçÏÇí‚é~Ç∑ÇÈDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅB
ǪÇÃåãâ ÅAéüÇÃÇÊǧǻèÛãµÇ≈èdëÂÇ»ñ‚ëËÇ™î≠ê∂Ç∑ÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
- ÉvÉçÉZÉX A Ç™ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇì«Ç›èëÇ´â¬î\Ç≈ÉIÅ[ÉvÉìǵNjÇ∑ÅBResource Manager ÇÕǪÇÃÉtÉ@ÉCÉãÇ…ëŒâûÇ∑ÇÈÉäÉ\Å[ÉXÉ}ÉbÉvÇÉvÉçÉZÉX A ÇÃÉqÅ[ÉvÇ…ì«Ç›çûǛNjÇ∑ÅB
- ÉvÉçÉZÉX B ǙǪÇÃÉäÉ\Å[ÉXÇì«Ç›çûÇ›êÍópÇ≈ÉIÅ[ÉvÉìǵNjÇ∑ÅBResource Manager ÇÕǪÇÃÉtÉ@ÉCÉãÇ…ëŒâûÇ∑ÇÈÉäÉ\Å[ÉXÉ}ÉbÉvÇÉvÉçÉZÉX B ÇÃÉqÅ[ÉvÇ…ì«Ç›çûǛNjÇ∑ÅB
- DZÇÃå„ÅAÉvÉçÉZÉX A ÇÕÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇïœçXǵÅA
UpdateResFile ÇåƒÇ—èoǵǃÅAǪÇÍÇÁÇÃïœçXì‡óeÇÉfÉBÉXÉNÇ…èëÇ´ñflǵNjÇ∑ÅBDZÇÃèàóùÇ…ÇÊÇËÅAÉäÉ\Å[ÉXÉtÉ@ÉCÉãì‡ÇÃÇ≥NjǥNjǻÉäÉ\Å[ÉXÇÃà íuÇÕìÆìIÇ…ïœçXÇ≥ÇÍÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
- DZÇÃå„ÅAÉvÉçÉZÉX B ÇÕ Resource Manager ÇåƒÇ—èoǵǃÅAÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ©ÇÁÉäÉ\Å[ÉXÇì«Ç›çûǛNjÇ∑ÅBÉvÉçÉZÉX B Ç™éùǡǃǢÇÈÉäÉ\Å[ÉXÉ}ÉbÉvÇÃÉRÉsÅ[ÇÕLJÇÕÇ‚é¿ç€ÇÃÉtÉ@ÉCÉãÇΔÇÕàÍívǵǻǢÇΩÇflÅAResource Manager ÇÕãUÇÃÉäÉ\Å[ÉXÉfÅ[É^Çï‘Ç∑DZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
DZÇÃÇÊǧǻêßå¿ÇÕÅAÅwInside Macintosh: More Macintosh ToolboxÅxDždžÇÈÅuFSpOpenResFile ÅvÇÃê‡ñæÇÃÅuSpecial ConsiderationsÅvÇÃêflÇ≈ämǩDžê‡ñæÇ≥ÇÍǃǢNjÇ∑Ç™ÅAǪÇÃê‡ñæÇÕÅAÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ 2 ìxÉIÅ[ÉvÉìÇ∑ÇÈÇΔÇ´ÇÃñ‚ëËÇΔìØólÇ…ÅAê≥ǵÇ≠ǻǢì‡óeÇ™åJÇËï‘Ç≥ÇÍǃǢNjÇ∑ÅB
âåàï˚ñ@ÇÃÉåÉVÉs
DZDZÇ≈ÇÕÅAFSpOpenResFile ÇÃäÔñ≠Ç»ìÆçÏÇ™É\ÉtÉgÉEÉFÉAÇë‰ñ≥ǵDžǵǃǵNjǧÇÃÇñhÇÆÇΩÇflÇ…ñóßǬÉeÉNÉjÉbÉNÇÇ¢Ç≠Ǭǩè–âÓǵNjÇ∑ÅBDZÇÍÇÁÇÃÉeÉNÉjÉbÉNÇÕÅAç≈LJêÑèßÇ≈Ç´ÇÈLJÇÃÇ©ÇÁèáÇ…é¶ÇµÇ‹Ç∑ (ǵǩLJé¿ëïǵǂÇ∑Ç¢èáÇ…)ÅB
ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇàÍìxÇæÇØÉIÅ[ÉvÉìÇ∑ÇÈ
í èÌÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÉåÉxÉãÇÃÉRÅ[ÉhÇèëǢǃǢÇÈèÍçáÇÕÅAÉvÉçÉZÉXÇ™ä˘Ç…ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇÉIÅ[ÉvÉìǵǃǢÇÈDZÇΔÇãLâØÇµÇƒÇ®Ç´ÅAǪÇÍÇ 2 ìxÉIÅ[ÉvÉìÇ∑ÇÈÇÃÇñhÇÆÇÃÇ™ç≈LJä»íPÇ»ï˚ñ@Ç≈Ç∑ÅBéüÇÃÉRÅ[ÉhÇÕÅADZÇÃÇÊǧǻèàóùÇçsǧíPèÉÇ»ÉTÉìÉvÉãÇé¶ÇµÇƒÇ¢Ç‹Ç∑ÅB
static SInt16 gResourceResFile = 0;
static UInt32 gResourceUsageCount = 0;
static OSErr StartUsingResources(ConstFSSpecPtr fss)
{
OSErr err;
SInt16 tmpResFile;
err = noErr;
if (gResourceUsageCount == 0) {
tmpResFile = FSpOpenResFile(fss, fsRdWrPerm);
err = ResError();
if (err == noErr) {
gResourceResFile = tmpResFile;
}
}
if (err == noErr) {
gResourceUsageCount += 1;
}
return err;
}
static void StopUsingResources(void)
{
gResourceUsageCount -= 1;
if (gResourceUsageCount == 0) {
CloseResFile(gResourceResFile);
gResourceResFile = 0;
}
}
|
DZÇÃÉeÉNÉjÉbÉNÇï°êîÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ…ägí£Ç∑ÇÈï˚ñ@ÇÕÅAÉfÉxÉçÉbÉpé©êgÇÃó˚èKÇΔǵǃǮǴNjÇ∑ÅB
ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇì«Ç›çûÇ›êÍópÇ≈ÉIÅ[ÉvÉìÇ∑ÇÈ
ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ™åªç›ÇÃÉvÉçÉZÉX (ÇΩÇΔǶnjÅAÉVÉXÉeÉÄã@î\ägí£ÇÃÉRÅ[ÉhÇ≈) Ç…ÇÊǡǃä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈǩǫǧǩÇÕǡǴÇËÇÌÇ©ÇÁǻǢèÛãµÇ≈ÇÕÅAç≈LJä»íPÇ»âåàï˚ñ@ÇÕèÌÇ…ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇì«Ç›çûÇ›êÍópÇ≈ (ǬNjÇËÅAfsRdPerm Çégǡǃ) ÉIÅ[ÉvÉìÇ∑ÇÈDZÇΔÇ≈Ç∑ÅBDZÇÃï˚ñ@ÇégópÇ∑ÇÈÇΔÅAà¿ëSÇ…ÉNÉçÅ[ÉYÇ∑ÇÈDZÇΔÇÃÇ≈Ç´ÇÈêVǵǢÉäÉ\Å[ÉXÉäÉtÉ@ÉåÉìÉXî‘çÜÇ™èÌÇ…ï‘Ç≥ÇÍÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
DZÇÃâåàï˚ñ@ÇÇ≥ÇÁÇ…êÙó˚Ç≥ÇÍÇΩLJÇÃÇ…Ç∑ÇÈÇ…ÇÕÅAÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇÃÉIÅ[ÉvÉìÅAì«Ç›çûÇ›ÅAÇ®ÇÊÇ—ÉNÉçÅ[ÉYÇÇ∑njǂÇ≠çsÇ¢ÅAǪÇÃä‘Ç…ëºÇÃÉvÉçÉZÉXÇ…éûä‘Ç™à¯Ç´ìnÇ≥ÇÍǻǢÇÊǧDžǵNjÇ∑ÅBDZǧÇ∑ÇÍÇŒÅAÉtÉ@ÉCÉãÇì«Ç›çûÇÒÇ≈Ç¢ÇÈä‘Ç…ï ÇÃÉvÉçÉZÉXǙǪÇÃÉtÉ@ÉCÉãÇïœçXÇ∑ÇÈDZÇΔLJǻÇ≠Ç»ÇËÅAëOèqǵÇΩÇÊǧǻñ ì|Ç»ñ‚ëËÇ…ÇÊÇÈè·äQÇç≈è¨å¿Ç…ó}ǶÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÃï˚ñ@ÇÕàÍíËÇÃèÛãµÇæÇØÇ≈ñóßÇøÇ‹Ç∑Ç™ÅAÉåÉVÉsÇà 1 ǬÇΔǵǃäoǶǃǮÇ≠ÇΔämǩDžï÷óòÇ≈Ç∑ÅB
TopMapHndl ÇÉ`ÉFÉbÉNÇ∑ÇÈ
ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ™åªç›ÇÃÉvÉçÉZÉXÇ…ÇÊǡǃä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈǩǫǧǩǙÇÕǡǴÇËÇÌÇ©ÇÁǻǢèÛãµÇ≈ÅAÉäÉ\Å[ÉXÇì«Ç›èëÇ´â¬î\Ç≈ÉIÅ[ÉvÉìÇ∑ÇÈïKóvǙdžÇÈèÍçáÅATopMapHndl â∫à ÉÅÉÇÉäÉOÉçÅ[ÉoÉãÇÉÇÉjÉ^ǵǃÅAFSpOpenResFile ÇåƒÇ—èoǵÇΩå„Ç≈ïœçXÇ™â¡Ç¶ÇÁÇÍǃǢǻǢǩǫǧǩÇämîFÇ∑ÇÈDZÇΔÇ™ç≈ëPÇÃÉeÉNÉjÉbÉNÇ≈Ç∑ÅBDZÇÃÉOÉçÅ[ÉoÉãÇ…ïœçXÇ™â¡Ç¶ÇÁÇÍǃǢÇÈèÍçáÇÕÅAêVǵǢÉäÉ\Å[ÉXÉ}ÉbÉvÇ™ÉäÉ\Å[ÉXÉ`ÉFÅ[ÉìÇÃÇ¢ÇøÇŒÇÒè„Ç…í«â¡Ç≥ÇÍǃǮÇËÅAǪÇÍÇÇ´ÇøÇÒÇΔÉNÉçÅ[ÉYÇ∑ÇÈê”îCǙdžÇËÇ‹Ç∑ÅBDZÇÃÉOÉçÅ[ÉoÉãÇ…ïœçXÇ™â¡Ç¶ÇÁÇÍǃǢǻǢèÍçáÅAä˘ë∂ÇÃÉäÉ\Å[ÉXÉ}ÉbÉvÉäÉtÉ@ÉåÉìÉXî‘çÜÇ™ï‘Ç≥ÇÍǃǮÇËÅAǪÇÍÇÉNÉçÅ[ÉYÇ∑ÇÈïKóvÇÕdžÇËÇ‹ÇπÇÒÅB
éüÇÃÉRÅ[ÉhÇÕDZÇÃÉeÉNÉjÉbÉNÇãÔëÃìIÇ…é¶ÇµÇƒÇ¢Ç‹Ç∑ÅB
static void SafeOpenResFileReadWrite(ConstFSSpecPtr fss)
{
OSErr err;
SInt16 oldResFile;
Handle oldTopMap;
SInt16 resFile;
Boolean shouldClose;
oldResFile = CurResFile();
oldTopMap = LMGetTopMapHndl();
resFile = FSpOpenResFile(fss, fsRdWrPerm);
err = ResError();
if (err == noErr) {
shouldClose = (LMGetTopMapHndl() != oldTopMap);
// do the stuff with the resource file
if (shouldClose) {
CloseResFile(resFile);
}
}
UseResFile(oldResFile);
}
|
ǻǮÅADZÇÃÉeÉNÉjÉbÉNÇÕÅAÉtÉ@ÉCÉãÇì«Ç›èëÇ´â¬î\Ç≈ÉIÅ[ÉvÉìÇ∑ÇÈïKóvǙdžÇËÅAǪÇÃÉtÉ@ÉCÉãÇ™åªç›ÇÃÉvÉçÉZÉXÇ…ÇÊǡǃä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈǩǫǧǩÇÕǡǴÇËÇÌÇ©ÇÁǻǢèÍçáÇÃÇ›óLå¯Ç≈džÇÈì_Ç…íçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅBDZÇÃÇÊǧǻèÍçáÅADZÇÃÉeÉNÉjÉbÉNÇÕîÒÉAÉvÉäÉPÅ[ÉVÉáÉìÉRÅ[Éh (ÉVÉXÉeÉÄã@î\ägí£ÅAã§óLÉâÉCÉuÉâÉäÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉvÉâÉOÉCÉìǻǫ) Ç…ÇÊǡǃïKóvÇΔÇ≥ÇÍÇ‹Ç∑Ç™ÅAïWèÄÉtÉ@ÉCÉãÉtÉBÉãÉ^ä÷êîǻǫÇÃñ¢ímÇÃä¬ã´Ç≈é¿çsÇ≥ÇÍǃǢÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÉRÅ[ÉhÇ≈LJñóßǬDZÇΔǙdžÇËÇ‹Ç∑ÅB
èÌÇ… CurResFile Çï€éùÇ∑ÇÈ
ëOèqÇÃÇ«ÇÃÉeÉNÉjÉbÉNÇégópÇ∑ÇÈǩDžä÷åWÇ»Ç≠ÅAFSpOpenResFile ÇÃåƒÇ—èoǵÇΔÅACurResFile Ç®ÇÊÇ— UseResFile ÇÃåƒÇ—èoǵÇÇ–ÇΔÇ‹ÇΔÇflÇ…àµÇ¢ÅAÉRÅ[ÉhÇ™åÎǡǃåªç›ÇÃÉäÉ\Å[ÉXÉ}ÉbÉvÇïœçXǵǃǵNjÇÌǻǢÇÊǧDžÇ∑ÇÈÇÃLJÇÊÇ¢çlǶÇ≈Ç∑ÅBëOèqÇÃÉRÅ[ÉhÇ≈ÇÕÅADZÇÃÉeÉNÉjÉbÉNLJãÔëÃìIÇ…é¶ÇµÇƒÇ¢Ç‹Ç∑ÅB
ÉpÅ[É~ÉbÉVÉáÉìÇÉ`ÉFÉbÉNÇ∑ÇÈ
ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ…èëÇ´çûÇ›ÇçsǧïKóvǙdžÇËÅAÉtÉ@ÉCÉãÇ™ä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈǩǫǧǩÇÕǡǴÇËǵǻǢèÍçáÇÕÅAÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇí≤Ç◊ǃÅAǪÇÍÇ™ì«Ç›èëÇ´ÉAÉNÉZÉXÇÉTÉ|Å[ÉgǵǃǢÇÈǩǫǧǩÇämîFǵNjÇ∑ÅBì«Ç›èëÇ´â¬î\Ç»ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜǙdžǡǃLJÉtÉ@ÉCÉãÇ÷ÇÃèëÇ´çûǛǙê≥èÌÇ…é¿çsÇ≈Ç´ÇÈǩǫǧǩÇÕï€èÿÇ≥ÇÍǃǢNjÇπÇÒÇ™ÅAè≠Ç»Ç≠ÇΔLJç≈èâÇÃÉXÉeÉbÉvÇ≈DZÇÃDZÇΔÇÉ`ÉFÉbÉNÇ∑ÇÈÇÃÇÕÇÊÇ¢çlǶÇ≈Ç∑ÅB
File Manager ÇÃÉãÅ[É`ÉìÇ≈džÇÈ PBGetFCBInfoSync ÇåƒÇ—èoǵÅAioFCBFlags ÇÃÉrÉbÉg 8 ÇÃílÇéÊìæÇ∑ÇÈDZÇΔÇ≈ÅAÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇ™ì«Ç›èëÇ´â¬î\Ç≈džÇÈǩǫǧǩÇÉ`ÉFÉbÉNÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBéüÇÃÉRÅ[ÉhÇÕDZÇÃÉeÉNÉjÉbÉNÇãÔëÃìIÇ…é¶ÇµÇƒÇ¢Ç‹Ç∑ÅB
static Boolean IsResourceFileRefNumWritable(SInt16 rsrcRefNum)
{
Boolean result;
FCBPBRec fcbPB;
fcbPB.ioNamePtr = nil;
fcbPB.ioVRefNum = 0;
fcbPB.ioRefNum = rsrcRefNum;
fcbPB.ioFCBIndx = 0;
if ( PBGetFCBInfoSync(&fcbPB) == noErr ) {
result = ((fcbPB.ioFCBFlags & (1 << 8)) != 0);
} else {
result = false;
}
return result;
}
|
óvñÒ
ìØÇ∂ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ 2 ìxÉIÅ[ÉvÉìÇ∑ÇÈèÍçáÅAResource Manager Ç…ÇÊÇËÅAéüÇÃÇÊǧǻäÔñ≠Ç»ìÆçÏÇ™î≠ê∂ǵNjÇ∑ÅB
-
FSpOpenResFile Ç™êVǵǢÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇÉIÅ[ÉvÉìÇ∑ÇÈë„ÇÌÇËÇ…ÅAä˘ë∂ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇï‘Ç∑ÅB
- ì«Ç›èëÇ´ÉAÉNÉZÉXÇñæé¶ìIÇ…óvãÅǵÇΩèÍçáÇ≈LJÅA
FSpOpenResFile Ç™ì«Ç›çûÇ›êÍópÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇï‘Ç∑ÅB
- ì«Ç›çûÇ›êÍópÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇ…ÇÊǡǃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇì«Ç›çûÇfièÍçáÇ≈LJÅAìØéûÇ…ï ÇÃì«Ç›èëÇ´â¬î\Ç»ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÉäÉtÉ@ÉåÉìÉXî‘çÜÇ…ÇÊǡǃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ…ïœçXÇ™â¡Ç¶ÇÁÇÍǃǢÇÈÇΔÅAÉäÉ\Å[ÉXÉfÅ[É^Ç™âÛÇÍǃǵNjǧâ¬î\ê´Ç™Ç†ÇÈÅB
DZÇÍÇÁÇÃñ‚ëËÇâÒîÇ∑ÇÈç≈ëPÇÃï˚ñ@ÇÕÇΔÇ…Ç©Ç≠ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ 2 ìxÉIÅ[ÉvÉìǵǻǢDZÇΔÇ≈Ç∑ÅBDZÇÍÇîÇØÇÈDZÇΔÇ™Ç≈ǴǻǢèÍçáÅADZÇà TECHNOTE Ç…ãLèqÇ≥ÇÍǃǢÇÈÅAè·äQÇç≈è¨å¿Ç…ó}ǶÇÈÇΩÇflÇ…óòópÇ≈Ç´ÇÈÉAÉvÉçÅ[É`ÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB
|